﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../global/head.h"
#include "../macro/head.h"
#include "aio_impl.h"
#include "aio_mgr.h"

////////////////////////////////////////////////////////////////////////////////////////////
// 

namespace xos_aio
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    aio_mgr::aio_mgr()
    {
    }

    aio_mgr::~aio_mgr()
    {
        if( g_pSysData )
        {
            g_pSysData->term();
            delete g_pSysData;
            g_pSysData = 0;
        }
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////

    // 
    // set callback thread. all aios use ONE callback thread.
    // 
    int aio_mgr::set_callback_thread( xos_box::i_callback * pCallbackThread )
    {
        int ret = 0;
        g_pSysData->m_pCallbackObj = pCallbackThread;
        return ret;
    }

    // 
    // create aio
    // 
    int aio_mgr::create( i_aio ** ppv )
    {
        int nRet = 0;
        aio_impl * p = aio_impl::get_item_from_pool( true );
        p->init();
        *ppv = p;
        return nRet;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int aio_mgr::put_back_to_pool( T * pT, bool bLock )
    {
        int ret = 0;
        delete this;
        return ret;
    }

    int aio_mgr::init()
    {
        int ret = 0;

        if( 0 == ret )
        {
            struct sigaction act = { { 0 } };
            act.sa_handler = SIG_IGN;
            sigemptyset(&act.sa_mask);
            act.sa_flags = SA_NODEFER ;
            sigaction( SIGPIPE, &act, 0 );
        }

        return ret;
    }

    int aio_mgr::term()
    {
        int ret = 0;
        return ret;
    }

} // xos_aio
